<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Класс для постраничного вывода
 * Переопределяет стандартный одноименный классы
 * 
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */
class CI_Pagination {
   
   /**
    * Instance
    *
    * @access private
    * @var object
    */
   var $_obj = null;
   
   /**
    * Номер страницы
    *
    * @access private
    * @var integer
    */
   var $_page = 1;
   
   /**
    * Количество страниц
    *
    * @access private
    * @var integer
    */
   var $_num_pages = 1;
   
   /**
    * Число числовых ссылок перед и после текущей страницы
    *
    * @access private
    * @var integer
    */
   var $_num_links = 3;
   
   /**
    * URL для перехода на страницы
    * Должен сожержать параметр {%page%} для замены страницы
    *
    * @access private
    * @var string
    */
   var $_url = '';
   
   /**
    * Массив элементов для вывода
    *
    * @access private
    * @var private
    */
   var $_template = null;
   
   /**
    * Конструктор класса
    *
    * @access public
    * @param array $params
    * @return CF_Pagination
    */
   function CF_Pagination() {
      $this->_obj =& get_instance();
   } // end CF_Pagination
   
   /**
    * Установка номера текущей страницы
    *
    * @access public
    * @param integer $page
    */
   function set_page($page) {
      $this->_page = $page;
   } // end set_page
   
   /**
    * Получение номера текущей страницы
    *
    * @access public
    * @return integer
    */
   function get_page() {
      return $this->_page;
   } // end get_page
   
   /**
    * Установка количества страниц
    *
    * @access public
    * @param integer $num_pages
    */
   function set_num_pages($num_pages) {
      $this->_num_pages = $num_pages;
   } // end set_num_pages
   
   /**
    * Получение количества страниц
    *
    * @access public
    * @return integer
    */
   function get_num_pages() {
      return $this->_num_pages;
   } // end get_num_pages
   
   /**
    * Установка числовых ссылок перед и после текущей страницы
    *
    * @access public
    * @param integer $num_links
    */
   function set_num_links($num_links) {
      $this->_num_links = $num_links;
   } // end set_num_links
   
   /**
    * Получение числовых ссылок перед и после текущей страницы
    *
    * @access public
    * @return integer
    */
   function get_num_links() {
      return $this->_num_links;
   } // end get_num_links
   
   /**
    * Установка ссылки на страницу
    * Ссылка должна содержать параметр {%page%} для замены на нужную страницу
    *
    * @access public
    * @param string $url
    */
   function set_url($url) {
      $this->_url = $url;
   } // end set_url
   
   /**
    * Получение ссылки на страницу
    *
    * @access public
    * @return string
    */
   function get_url() {
      return $this->_url;
   } // end get_url
   
   /**
    * Установка шаблона для вывода
    *
    * @access public
    * @param array $template
    */
   function set_template($template) {
      if (is_array($template)) {
         $this->_template = $template;
      }
   } // end set_template
   
   /**
    * Генерирование ссылок
    *
    * @access public
    * @return string
    */
   function create_links() {
      $this->_compile_template();
      if (!($this->_num_pages > 1 && $this->_page <= $this->_num_pages && $this->_page > 0)) {
         return '';
      }
      $start = (($this->_page - $this->_num_links) > 0) ? $this->_page - $this->_num_links : 1;
      $end   = (($this->_page + $this->_num_links) < $this->_num_pages) ? $this->_page + $this->_num_links : $this->_num_pages;
      $output = '';
      // Caption
      $output .= str_replace(array('{%page%}', '{%total%}'), array($this->_page, $this->_num_pages), $this->_template['caption']);
      // Prev
      if (($this->_page - 1) > 0) {
         $output .= str_replace('{%page%}', $this->_page - 1, str_replace('{%url%}', $this->_url, $this->_template['prev_link']));
      } else {
         $output .= $this->_template['prev'];
      }
      $output .= $this->_template['nav_sep'] . $this->_template['page_open'];
      // Pages
      for ($loop = $start; $loop <= $end; $loop++) {
         if ($this->_page == $loop) {
            $output .= str_replace('{%page%}', $loop, str_replace('{%url%}', $this->_url, $this->_template['page']));
         } else {
            $output .= str_replace('{%page%}', $loop, str_replace('{%url%}', $this->_url, $this->_template['page_link']));
         }
         if ($loop < $end) {
            $output .= $this->_template['page_sep'];
         }
      }
      $output .= $this->_template['page_close'] . $this->_template['nav_sep'];
      // Next
      if ($this->_page < $this->_num_pages) {
         $output .= str_replace('{%page%}', $this->_page + 1, str_replace('{%url%}', $this->_url, $this->_template['next_link']));
      } else {
         $output .= $this->_template['next'];
      }
      $output = $this->_template['open'] . $output . $this->_template['close'];
      return $output;
   } // end create_links
   
   /**
    * Разбираемся с шаблонами
    *
    * @access private
    */
   function _compile_template() {
      if (null === $this->_template) {
         $this->_template = $this->_default_template();
      } else {
         $template = $this->_default_template();
         foreach ($template as $key => $val) {
            if (!isset($this->_template[$key])) {
               $this->_template[$key] = $val;
            }
         }
      }
   } // end _compile_template
   
   /**
    * Установка шаблона по умолчанию
    *
    * @access private
    * @return array
    */
   function _default_template() {
      return array(
         'open'       => '<div class="pagination-block">',
         'close'      => '</div>',
         'page_open'  => '<div class="pagination">',
         'page_close' => '</div>',
         'prev'       => '<a class="page-previous-disabled">&nbsp;</a>',
         'prev_link'  => '<a href="{%url%}" class="page-previous">&nbsp;</a>',
         'next'       => '<a class="page-next-disabled">&nbsp;</a>',
         'next_link'  => '<a href="{%url%}" class="page-next">&nbsp;</a>',
         'page'       => '<a href="{%url%}" class="item-selected">{%page%}</a>',
         'page_link'  => '<a href="{%url%}" class="item">{%page%}</a>',
         'nav_sep'    => '',
         'page_sep'   => '<div class="divider">&nbsp;</div>',
         'caption'    => '<div class="page-caption">Страница {%page%} из {%total%}</div>'
      );
   } // end _default_template
   
}
